Делай дамики, которые находятся каждый на своём фиксированном расстоянии и угле от цели и перемещай их триггерно периодически. Не самое приятное занятие, но самое простое, для твоего случая
Только мемхак, если вас не устраивают баффы детектов (волшебный огонь, посох чужих глаз, порошок прозрения).
Стоит отметить видимость юнита и детекция - разные опции, инвизер может быть обнаружен но не видем в тумане войны.
Ась, что кого? для 126 отслеживание выделения в группе только на мемхаке, чистый 126 лесом, на рефордже через GetChild, вот ссылка, надо скопипастить на русском на Xgm
Но если принебречь этим множественным выбором и представить что выбор единичный
Тогда на гуи всё есть и получиться
C - Юнит выбран
У - Юнит такой-то, способность такая то есть, владелец выбранного=владелец выбирающего
Д -
set s = "" s = string
if p = GetLocalPlayer() then
set s = "Тут\\Типа\\Адрес\\Модели.mdx"
endif
call СоздатьСпецэффект(s,x,y) x,y - координаты, либо вместо них точка, либо виджет
а если по поводу вопроса
Но не понимаю, как именно применить тут эту систему
Система уже расписана, суть в том что у локального игрока создастся эффект с моделью, а у остальных с пустышкой и они ничего не увидят
set s = "" s = string пустышка
if p = GetLocalPlayer() then -- если локальный игрок тогда
set s = "Тут\\Типа\\Адрес\\Модели.mdx" -- модель уже не пустышка
не нужно.
Утечка с группами происходит потому что, незаметно для пользователя GUI, создается новая группа, которая не уничтожается и не обнуляется (в случае если происходит обращение к юнитам вокруг точки или в области). Обращаясь к группам игроков ничего не создается, происходит обращение к заранее созданным группам игроков.
ххххххх
Ну дык.
Ты пикаешь всех юнитов вокруг позиции кастера.
В т.ч. кастера.
Он же не враг сам себе)
так что выполнится оба действия могут)
и если там дамми есть - в ту же пачку, могут вызвать срабатывание.
Я фильтрую дамми по левелу, лвл дамми ставлю 0.
я так и не понял почему ты не можешь просто сделать как улучшение что не так с улучшением как в обычном случае.
дело в описании, вот и не могу так сделать,если сделать через улучшение здания, то при наведении на иконку вплывает подсказка, та же подсказка что будет и у самого здания в списке построек у светлячка, тоесть если делать через улучшение (по идее этот же юнит должен быть и в списке построек (а он там есть) ту подсказку которую я хочу будет лишней. вот пример: Древо жизни превращается в древо мира, при этом все союзные юниты вблизи древа получают повышеную регенерацию здоровья. (а теперь представь что эта подсказка будет в списке построек у светлячка, вообще не то)
Решил проблему путем выбора древа когда истекает однократный таймер, также подумал и решил что наверно лучше делать через способности, а не исследования. Но у меня остался один вопрос, если этот тригер отвечающий за применения этих способностей будет использовать несколько игроков, я не знаю будет ли использоватся оно коректно или нет, также и с отдельным триггером Таймер. Вот что вышло в данный момент:
function PolarProjectionX takes real x, real dist, real angle returns real
return x + dist * Cos(angle * bj_DEGTORAD)
endfunction
function PolarProjectionY takes real y, real dist, real angle returns real
return y + dist * Sin(angle * bj_DEGTORAD)
endfunction
function Trig_Hit_Actions takes nothing returns nothing
local unit caster = GetTriggerUnit()
local real face = GetUnitFacing(caster)
local real x = PolarProjectionX(GetUnitX(caster), 100., face)
local real y = PolarProjectionY(GetUnitY(caster), 100., face)
local group targets = CreateGroup()
local unit target
call GroupEnumUnitsInRange(targets, x, y, 100., null)
set target = FindClosestToXY(targets, x, y)
if target != null then
call UnitDamageTargetBJ(caster, target, 100., ATTACK_TYPE_CHAOS, DAMAGE_TYPE_UNIVERSAL)
set target = null
endif
set caster = null
call DestroyGroup(targets)
set targets = null
endfunction
Нашёл систему, где звук передаётся в таймер, который истекает через 0 секунд. В результате один и тот же звук может проигрываться несколько раз без всяких проблем. В инетике пишут мол это такой баг движка.
Чтобы отследить созданного клона делается глобальный триггер с событием - Юнит вызывает еще 1 юнита, условие - юнит иллюзия, действие записать в bj_LastCreatedUnit == GetSummonedUnit(), после приказываем даммику кастануть жезл иллюзий в цель, сразу после приказа - берем bj_lastCreatedUnit - это наша иллюзия, записываем её в локалку или если действия мгновенные и не вызывают других триггеров юзающих эту глобалку то делаем с клоном все что нужно...
Т.к фрог юзает триггеры, он делает так, создает триггер, к нему вешает действие где в глобалку записывают GetSummonedUnit(), ну а после удаляет это действие у триггера, берет клона из глобалки, добавлает этому же триггеру другое действие и ставит событие на переодик 0.02 сек, чтобы двигать дамми снаряд, кароч юзает 1 триггер и для поиска клона и для движения дамми и для всего остального.
вампиризмы работают лишь на основную атаку, не затрагивая модификаторы.
не думаю, москиты не дружат с всякими проверками - подошел ли юнит к юниту или нет, просто давай неуяз, да и вовсе нафига тогда рабочие с ратушой? Так золото слабо дать или заставить даммиков проигрывать анимацию таскания мешков работникам.
Еще раз, все модификаторы уроны, промахи, хреномахи рассчитываются в момент замаха, до успешного завершения атаки. Потом уже неважно, можно удалить юнита и снаряд достигнет цели (ну если ничего не помешает вроде промаха) и нанесет урон.
Меняется - можно поставить свой бафф, что сделан на основе оригинальный. Естественно, нельзя сделать так, чтобы отравленные стрелы станили.
Стан только у баша.
rsfghd, Ну так у меня и так 1.26а, закинул в папку с игрой коннектор, и game.dll, сайт коннектор видит, сам коннектор меня подключает, но игры не появляются.
А много ли юнитов будут с хп баром? если серьёзно то решения нет и фрейм не найти этот, оно зашито в недра движка. Но опять таки Disable pre-selection вариант всё таки, если потом отрисовать кастомные хп бары через специальную модель, если она будет эффектом, то это не вызовет никакой доп нагрузки даже у 100 юнитов.
Ниче не понял. Потом опять не понял.
В общем есть модель юнита, а есть модель снаряда. Это 2 разные модели. Они никак не связаны. То, что пропадает "снаряд" в модели юнита при броске( например топора) - это анимация атаки модели юнита. Если не нужно, чтобы топор не пропадал при броске - редактируй модель юнита в визе
если тебе звук нужен только для обладателя героя, то ты используешь вместо current camera view
position of hero[GetPlayerId(GetLocalPlayer())]
где hero - массив героев, индекс это номер игрока начиная с нуля
то есть hero[0] красный геро, hero[1] синий и т.д.
тогда это вернет позицию локального героя, а если герой не существует то центр карты
Странное понимание механики. Не бывает универсального лучшего способа, потому и существуют разные способы для конкретных ситуаций.
А экономить байты и такты процессора, заранее пользуясь интерпретируемым скриптовым языком, это вообще моветон.
Разве массив в WarCraft III не предынициализирует 8192 ячейки памяти (по Вашей формуле, в моём случае он потребляет 8192*4=32768 байт, то есть 32Кб)? Он ведь не динамический.
Нет, он динамический. Исходный размер при создании - 1024. И расширяется на 1024 ячейки по мере доступа вплоть до максимальных 8192.
примергде-то надо еще таймером будет. просто по идее система работает так: происходит событие изменения ресурса (запоминаем сколько), следом происходит основное событие (покупка-продажа). значит, здесь ловим итем, потом вычисления с налогами. Но такой порядок бывает не всегда. Вот допустим продажа: сначала продаем (итем забирают, событие продажи), потом дают деньги (событие изменения ресурса). как видишь, здесь надо тогда таймером через 0.00 сек или сколько то сек проверять измену реса
хотел реализовать похожую систему (проводить торговлю не через чат, а через кнопочки). только на мем хаке. изменить можно только в мем хаке. если вы изменяете цену типу предмета, тогда она у всех итемов данного типа меняется. сделал так: копию на каждого игрока, у одного будет одна цена, у другого другая. короче каждый игрок товар может предложить по разной цене. как это будет работать пока не знаю (я не все продумал, и поэтому не доделал).
можно стоимость убрать и триггерами начислять/убавлять
Bergi_Bear, не знаю, я так понимаю, что редактор кампаний как-то по особому позволяет редактировать карту. Насколько помню, изменения карты, что вносятся через редактор кампаний, не влияют на саму карту.
Через тип текстуры земли или как там трава называется.
За кругом используешь ту, которой нет в игровой зоне. Если юнит находиться на ней, то твои действия.
Smart096, баг только в этой карте?
в новых картах бага нету?
если да то стоит проверить импортируемые модели и текстуры (мб часть битая)
но с вероятностью в 60% проблема в системе ибо было много жалоб на баги в вин10
У твоей модели, которая добавляется, вероятно есть нестандартные текстуры. Нужно правильно расположить модель относительно ее текстур. Насколько я помню, я их располагал в одну папку и, вроде как, работало.
По коду честно говоря ничего не понятно. Но в отлове урона это обычная ошибка, когда урон наносится внутри триггера, отлавливающего урон или если он вызывает действия которые наносят урон и снова вызывают этот триггер. Бесконечная рекурсия в общем роняет игру.
Вот обновленная версия на структурах, я её вроде выкладывал...
либо используйте CreateCreepOfType для создания крипов, так будет респаунить тока тех крипов которых вы создали этой функцией...
pro100master, не самый лучший вариант
куча таймеров может вызвать тормоза
лучше использовать 1 периодический таймер и им просто перебирать список умерших юнитов
делаешь области примерно x1 на y1 (точка) у каждой декорации, когда приходишь фиксируешь эти точки через set = (центр точки декорации), после функция, которая добавляет БЕ (боевая единица), без русификатора функция "create" и по одной БЕ на каждую точку с ориентировкой на того кто входит в область (так же фиксируй позицию БЕ, которая входит в область), и после всего этого удаляй точки, которые зафиксированы на декор и на БЕ, которая вошла в область.
можно добавит ещё эффект появления на каждой точке у декора, будет красиво)
Alexey103, руки распримите и сделайте триггерную смену анимации, "stand" - при завершении морфа, чтобы небыло death. Для моделей с альтернативными формами, меняются тег анимации, про это есть статьи. Если не получается - смотрите что вы сделали нетак.
так вроде там морф (спец абилка). после естественной смерти юнит морфится (событие смерти никак не отслеживается). И это легко отслеживается через "приводит в действие". используй всегда дебаги, выводи на экран. я тоже не всегда знаю, проверяю
подробные абилки
Феникс 'AHpx' - вызывает феникса (можно указать кол-во вызванных). Появляется рядом с кастером. Может вызвать безграничное число птиц. Но есть один нюанс со фениксом - у него есть способность 'Превращение в феникса' Aphx, которое после гибели превращает яйцо. Эта способность не позволяет призывать больше одной жар-птицы. Нельзя отследить кастера - того кто призвал эту птицу (debug показывает что феникс призывает феникса, то есть он сам себя призвал) Превращение в феникса 'Aphx' - морф работает при смерти. У фенникса каждый раз становится хп меньше (так специально сделали в РО: у феникса отрицательный реген), и когда умрет естественной смертью (не от руки врагов), тогда превращается в яйцо (такой цикл). Яйцо просуществует несколько секунд (можно задать длительность морфа, если задать 0.00 - постоянный морф). После из яйца рождается феникс.
Как минимум можно переносить данные с карты.Но таким образом ты заменишь то,что у тебя в карте.Другим способом по чуть чуть переносишь и ставишь всё как надо (требования всякие).Таким образом тебе как минимум не нужно будет делать описания и хар-ки.Ну или можешь сам их редактировать.В общем,такие дела.
Создаёшь в редакторе ИИ порядок действий, сохраняешь, импортируешь и запускаешь используя триггеры ( действия ИИ) для конкретного игрока (например: синий). Могу если нужно скинуть карту пример.
DracoL1ch, Не понял как я поменяю количество еды приносяший? DracoL1ch, или абилка такой есть? DracoL1ch, или ты имел виду создать типо так но на основе юнита (Сам писал)
set amount = R2I(amount) - R2I(this[u])
if amount < 0 then
set amount = -amount
set rawcode = rawcode + this.count
endif
set abilityId = this.count - 1
set abilityLevel = 4
set currentAbility = rawcode + abilityId
loop
exitwhen amount == 0
if amount >= powersOf2[abilityId * 3 + (abilityLevel - 2)] then
call UnitAddAbility(u, currentAbility)
call SetUnitAbilityLevel(u, currentAbility, abilityLevel)
call UnitRemoveAbility(u, currentAbility)
set amount = amount - powersOf2[abilityId * 3 + (abilityLevel - 2)]
else
set abilityLevel = abilityLevel - 1
if abilityLevel <= 1 then
set abilityId = abilityId - 1
set abilityLevel = 4
set currentAbility = rawcode + abilityId
endif
endif
endloop
Сделал если кому нужно контроль максимальной еды
// RUS: Создаем 8 юнит еду (Каждый шаг увиличивает 2ух-кратный)
//! runtextmacro UnitStart()
//! i CreateUnit("hfoo", "zxF", "ufma", "8", "FOOD", "BTNMonsterLure.blp")
//! runtextmacro UnitEnd()
//! textmacro UnitStart
/* RUS: Тут можно убрать если не стоит (MemoryHack)
//! externalblock extension=lua ObjectMerger $FILENAME$
//! i function CreateUnit(base, prefix, field, count, name, icon)
//! i k = 0
//! i j = 0
//! i for i = 0, (count - 1) do
//! i j = j + 1
//! i createobject(base, prefix .. string.sub(chars, k + 1, k + 1))
//! i makechange(current, "unam", "Unit - " .. name)
//! i makechange(current, "utip", "")
//! i makechange(current, "utub", "")
//! i makechange(current, "unsf", "(+" .. tostring(2^i) .. ")")
//! i makechange(current, "uico", "ReplaceableTextures\\CommandButtons\\" .. icon)
//! i makechange(current, field, 2^i)
//! i k = k + 1
//! i end
//! i end
//! i setobjecttype("units")
//! i chars = "abcdefghijklmnopqrstuvwxyz"
*/
//! endtextmacro
//! textmacro UnitEnd
/* RUS: Тут можно убрать если не стоит (MemoryHack)
//! endexternalblock
*/
//! endtextmacro
globals
constant integer xe_MAX_PLAYERS = 7
// RUS: Контроль еды
constant integer xe_COUNT_FOOD = 8
constant integer xe_RAWCODE_FOOD = 'zxFa'
endglobals
struct Food
private static group array groups[xe_MAX_PLAYERS]
private static integer array powers[xe_COUNT_FOOD]
private static method onInit takes nothing returns nothing
local integer i = 1
set thistype.powers[0] = 1
loop
exitwhen i > xe_COUNT_FOOD
set thistype.powers[i] = thistype.powers[i - 1] * 2
set i = i + 1
endloop
set i = 0
loop
exitwhen i == xe_MAX_PLAYERS
set thistype.groups[i] = CreateGroup()
set i = i + 1
endloop
endmethod
public static method operator []= takes player p, integer i returns nothing
local integer count = xe_COUNT_FOOD - 1
local group g = thistype.groups[GetPlayerId(p)]
local unit u = FirstOfGroup(g)
loop
exitwhen u == null
call RemoveUnit(u)
call GroupRemoveUnit(g, u)
set u = FirstOfGroup(g)
endloop
loop
exitwhen i == 0
if i >= thistype.powers[count] then
call GroupAddUnit(g, CreateUnit(p, xe_RAWCODE_FOOD + count, 0., 0., 0.))
set i = i - thistype.powers[count]
else
set count = count - 1
endif
endloop
set u = null
set g = null
endmethod
endstruct
в 1.26 так делал xgm.guru/p/wc3/163817
Ща mix убраны и архитектура wc переделана, но идея таже - внедриться в процесс варкрафта и найти оффсеты функций.
Насколько я знаю в мемхаке функции достаточно понятным образом называются. Но тем не менее, вот список того что вам может понадобиться. Мне кажется этого хватит для описываемых вами целей.
GetUnitBaseDamage
SetUnitBaseDamage
AddUnitBaseDamage
GetUnitBonusDamage
SetUnitBonusDamage
AddUnitBonusDamage
GetUnitTotalDamage
Я сам не проверял, но они должны выполнять указанную функцию.
А по поводу сохранения - вам понадобится правильная версия pjass, её можно найти в этой статье: xgm.guru/p/wc3/memory-hack, да и вообще в ней все написано про то как запустить мемхак.
И в целом, с мемхаком не нужно слишком сложно думать - нужно просто его поставить, найти нужную функцию и использовать. Благо функции как я уже говорил названы понятным образом.
На сайте, вот тут, есть хорошая статья об этом. Там не совсем то, что вам нужно, но на базе данного примера вы сможете создать всё самостоятельно.
+
И, между прочим, старый форум ещё никто не отменял.
AllChosen, ты пока что не понимаешь, что делаешь.
ты должен вместо цикла с вэйтом использовать "периодичный" таймер и сдвигать координаты, но пока что советуют посмотреть примеры xgm.guru/p/wc3/spellmaker-stomp-spell-creation
есть таймер одноразовый и периодичный, это все один и то же таймер, просто запускает разные режимы. через TimerStart. Вы таймер уже создали так смотрю, теперь нужно ловить запуски таймеров
» WarCraft 3 / Отступы в коде
» WarCraft 3 / Видимость юнита
» WarCraft 3 / Не работает простой триггер
» WarCraft 3 / Баг с порталами
» WarCraft 3 / Вопрос по снаряду
» IrInA Host Bot / проблема с коннектором
» WarCraft 3 / Неуязвимое здание с отображением хп
» WarCraft 3 / Вращение юнита
» WarCraft 3 / Функция GetLocalPlayer()
» WarCraft 3 / Помощь по реализации
» WarCraft 3 / Не работает код (jass)
» WarCraft 3 / Узнать расстояние между юнитами
» WarCraft 3 / Зависание редактора
» WarCraft 3 / Карта не отображается в самом варкрафте
» WarCraft 3 / Баг WURST
» WarCraft 3 / Респавн крипов
» WarCraft 3 / Спавн юнитов при входе в область
» WarCraft 3 / Триггерное превращение?
» WarCraft 3 / Функция ForGroup
» WarCraft 3 / Редактирование иконок
» WarCraft 3 / Кампании
» WarCraft 3 / Функции МемХака
» WarCraft 3 / Добавление зеленого урона.
» WarCraft 3 / Способность прыжок
» WarCraft 3 / Вычисление урона героя